﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Agencia.Models;

namespace Agencia.Controllers
{ 
    [Authorize]
    public class ReservacionController : Controller
    {
        private AgenciaBD db = new AgenciaBD();
        private WsAerolinea.Service1 ws = new WsAerolinea.Service1();

        public List<WsAerolinea.Vuelo> Lista_Vuelos()
        {
            var vuelos = ws.Lista_Vuelos();

            var lista = (from v in vuelos
                         where v.Fecha > DateTime.Now
                         select v).ToList();

            return lista;
        }

        public List<WsAerolinea.Vuelo> Lista_VuelosBusqueda()
        {
            var vuelos = ws.Lista_Vuelos();

            var lista = (from v in vuelos
                         where v.Fecha > DateTime.Now
                         select v).ToList().Take(5);

            return lista.ToList();
        }

        public List<WsAerolinea.Pais> Lista_Paises()
        {
            return ws.Lista_Paises().ToList();
        }

        public Cliente Lista_Clientes(String cliente)
        {
            var client = (from c in db.Clientes
                          where c.Nombre_Usuario == cliente
                          select c).First();
            return client;
        }

        public ViewResult Index()
        {
            return View();
        }

        public ActionResult Busqueda()
        {
            ViewBag.Error = "";
            return View();
        }

        [HttpPost]
        public ActionResult Busqueda(int txtSalir, int txtLlegar,DateTime FechaSalida)
        {
            var vuelos = ws.Lista_Vuelos();

            var lista = (from v in vuelos
                         where v.Ciudad_Origen == txtSalir &&
                               v.Ciudad_Destino == txtLlegar &&
                               v.Fecha.Date == FechaSalida.Date &&
                               v.Fecha > DateTime.Now
                         select v).ToList();

            if (lista.Count > 0)
            {
                return RedirectToAction("ListaVuelos", new
                {
                    txtSalir = txtSalir,
                    txtLlegar = txtLlegar,
                    FechaSalida = FechaSalida.Date
                });
            }

            else
            {
                ViewBag.Error = "No Hay Vuelos Disponibles Con Ese Criterio";
                return View();
            }
        }

        public ActionResult ListaVuelos(int txtSalir, int txtLlegar, DateTime FechaSalida)
        {
            var vuelos = ws.Lista_Vuelos();

            var lista = (from v in vuelos
                         where v.Ciudad_Origen == txtSalir &&
                               v.Ciudad_Destino == txtLlegar &&
                               v.Fecha.Date == FechaSalida.Date &&
                               v.Fecha > DateTime.Now
                         select v).ToList();

            return View(lista);
        }

        public ActionResult DetallesVuelo(int asiento,int vuelo,String clase, double precio)
        {
            Boleta boleta = new Boleta();
            boleta.Numero_Asiento = asiento; 
            boleta.VueloId = vuelo;
            boleta.Clase = clase;
            boleta.Impuestos = precio * 0.16;
            boleta.Total = boleta.Impuestos + precio;
            boleta.Fecha_Emision = DateTime.Now;
            boleta.ClienteId = User.Identity.Name;
            return View(boleta);
        }

        public List<Reservacion> Lista_Reservaciones()
        {
            var reservaciones = db.Reservaciones.ToList();

            return reservaciones;
        }

        public ActionResult HacerReserva(int id)
        {
            WsAerolinea.Vuelo vuelo = ws.Lista_Vuelos().ToList().Find(v => v.Id == id);
            ViewBag.Error = "";

            return View(vuelo);
        }

        [HttpPost]
        public ActionResult HacerReserva(WsAerolinea.Vuelo vuelo, int cmbAsientos)
        {
            var reservaciones = db.Reservaciones;
            WsAerolinea.Vuelo vuelos = ws.Lista_Vuelos().ToList().Find(v => v.Id == vuelo.Id);

            if (ModelState.IsValid)
            {
                foreach (var item in reservaciones)
                {
                    if (item.Numero_Asiento == cmbAsientos)
                    {
                        ViewBag.Error = "Ya el asiento esta ocupado";
                        return View(vuelos);
                    }
                }
                
                return RedirectToAction("ProcesarReserva", new {id = vuelo.Id, cmbAsientos = cmbAsientos });
            }

            return View(vuelos);
        }

        public ActionResult ProcesarReserva(int id, int cmbAsientos)
        {
            WsAerolinea.Vuelo vuelo = ws.Lista_Vuelos().ToList().Find(v => v.Id == id);

            double agregado = 0.0;

            if (cmbAsientos <= 10)
            {
                ViewBag.Clase = "Primera Clase";
                agregado = vuelo.Precio * 2;
            }

            else if (cmbAsientos > 10 && cmbAsientos <= 25)
            {
                ViewBag.Clase = "Clase Economica";
                agregado = vuelo.Precio * 1.5;
            }
            else if (cmbAsientos > 25)
            {
                ViewBag.Clase = "Clase Turista";
                agregado = vuelo.Precio;
            }

            ViewBag.Asiento = cmbAsientos;
            ViewBag.Precio = agregado;
            ViewBag.Impuesto = agregado * 0.16;
            ViewBag.Total = ViewBag.Precio + ViewBag.Impuesto;

            return View(vuelo);
        }

        [HttpPost]
        public ActionResult ProcesarReserva(WsAerolinea.Vuelo vuelo, int cmbAsientos)
        {
            var reservaciones = db.Reservaciones;
            WsAerolinea.Vuelo vuelos = ws.Lista_Vuelos().ToList().Find(v => v.Id == vuelo.Id);
            Reservacion reservacion = new Reservacion();

            double agregado = 0.0;

            if (ModelState.IsValid)
            {
                foreach (var item in reservaciones)
                {
                    if (item.Numero_Asiento == cmbAsientos)
                    {
                        ViewBag.Error = "Ya el asiento esta ocupado";
                        return View(vuelos);
                    }
                }

                reservacion.Numero_Asiento = cmbAsientos;
                if (cmbAsientos <= 10)
                {
                    reservacion.Clase = "Primera Clase";
                    agregado = vuelos.Precio * 2.0;
                }
                else if (cmbAsientos > 10 && cmbAsientos <= 25)
                {
                    reservacion.Clase = "Clase Economica";
                    agregado = vuelos.Precio * 1.5;
                }
                else if (cmbAsientos > 25)
                {
                    reservacion.Clase = "Clase Turista";
                    agregado = vuelos.Precio;
                }

                reservacion.Precio = agregado;
                reservacion.Impuesto = agregado * 0.16;
                reservacion.Total = reservacion.Precio + reservacion.Impuesto;
                reservacion.Fecha = DateTime.Now;
                reservacion.VueloId = vuelo.Id;
                reservacion.ClienteId = User.Identity.Name;
                reservacion.Pago = 0;
                db.Reservaciones.Add(reservacion);
                ws.Pago_Vuelo(vuelo.Id);
                db.SaveChanges();
                return RedirectToAction("DetallesReserva", new { id = reservacion.Id, });
            }

            return View(vuelos);
        }

        public ActionResult DetallesReserva(int id)
        {
            Reservacion reservacion = db.Reservaciones.Find(id);
            ViewBag.Reserva = "La Reserva Se Ha Hecho Satisfactoriamente";
            return View(reservacion);
        }

        public ActionResult MisReservas(String id)
        {
            DateTime dia = DateTime.Now.AddDays(-2);
            var reservaciones = from r in db.Reservaciones
                                 where r.ClienteId == id
                                 && r.Fecha > dia
                                 && r.Pago == 0
                                 select r;

            return View(reservaciones);
        }

        public ActionResult CancelarReserva(int id, int vueloId)
        {
            Reservacion reservacion = db.Reservaciones.Find(id);

            return View(reservacion);
        }

        [HttpPost, ActionName("CancelarReserva")]
        public ActionResult CancelarConfirmada(int id, int vueloId)
        {
            Reservacion reservacion = db.Reservaciones.Find(id);
            String cliente = reservacion.ClienteId;
            db.Reservaciones.Remove(reservacion);
            ws.Cancelar_Reserva(vueloId);
            db.SaveChanges();

            return RedirectToAction("MisReservas", new { id = cliente });
        }

        public ActionResult FacturarReserva(int id)
        {
            Reservacion reservacion = db.Reservaciones.Find(id);
            return View(reservacion);
        }

        [HttpPost, ActionName("FacturarReserva")]
        public ActionResult PagarConfirmado(int id)
        {
            Reservacion reservacion = db.Reservaciones.Find(id);
            String cliente = reservacion.ClienteId;
            Boleta boleta = new Boleta();
            boleta.Numero_Asiento = reservacion.Numero_Asiento;
            boleta.Clase = reservacion.Clase;
            boleta.ClienteId = reservacion.ClienteId;
            boleta.Precio = reservacion.Precio;
            boleta.Impuestos = reservacion.Impuesto;
            boleta.Total = reservacion.Total;
            boleta.VueloId = reservacion.VueloId;
            boleta.Fecha_Emision = DateTime.Now;
            reservacion.Pago = 1;
            db.Boletas.Add(boleta);
            db.SaveChanges();

            return RedirectToAction("MisReservas", "Reservacion", new { id = cliente });
        }

        public ActionResult ListaEspera(int id)
        {
            WsAerolinea.Vuelo vuelo = ws.Lista_Vuelos().ToList().Find(v => v.Id == id);

            return View(vuelo);
        }

        [HttpPost, ActionName("ListaEspera")]
        public ActionResult Confirmado(int id)
        {
            WsAerolinea.Vuelo vuelo = ws.Lista_Vuelos().ToList().Find(v => v.Id == id);
            ListaEspera lista = new ListaEspera();
            lista.VueloId = vuelo.Id;
            lista.ClienteId = User.Identity.Name;
            lista.Fecha = DateTime.Now;
            db.Lista_Espera.Add(lista);
            db.SaveChanges();

            return RedirectToAction("Index","Reservacion");
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}